Bingo, Computer Graphics & Game Developer

Path Tracing Notes 1

Diffuse Reflection

以下笔记为读Syntopia后感,解决了不少概念上以及实际应用上的疑难点

入射光与表面法线夹角

cosθ=n.lcos\theta = \vec{n} \ldotp \vec{l}


出射光辐射度计算

Lout(wo)=KLin(wi)cosθdwiL_{out}(\vec{w_o}) = \int{K * L_{in}(\vec{w_i}) cos\theta} d\vec{w_i}

漫反射模型在表面上,任意方向进入的光其反射方向都为随机,因此在给定指定出射方向上的辐射度求解时需要对当前点的整个半球方向上的入射光进行考虑,因为所有光都有可能在这个方向上出射。

这里的常数K本质上「就是决定了多少入射辐射度会在给定方向out上出去」,这里基于能量守恒的定义Kcosθdwi1\int{Kcos\theta d\vec{w_i} \le 1},也就是出射辐射度绝不会大于入射辐射度。

简单的计算过后,也能发现K1πK \le \frac{1}{\pi}

漫反射模型当中,反照率albedo=Kπalbedo = K\pi,当然在基于物理的材质模型下albedo始终处于[0, 1]区间当中,也就是满足能量守恒。


漫反射模型的渲染方程的定义可以改为如下形式

Lout(wo)=albedoπLin(wi)cosθdwiL_{out}(\vec{w_o}) = \int{\frac{albedo}{\pi}*L_{in}(\vec{w_i})cos\theta d\vec{w_i}}

但漫反射模型的K因子无非是下列中通用BRDF形式的渲染方程

Lout(wo)=BRDF(wi,wo)Lin(wi)cosθdwiL_{out}(\vec{w_o}) = \int{BRDF(\vec{w_i}, \vec{w_o})*L_{in}(\vec{w_i})cos\theta d\vec{w_i}}

为了计算上述的无穷积分,也就可以引入Monte Carlo Sampling。本质上就是为了求取一个积分的估计量,可以采用不断提升采样数量并求取平均来解决

abf(x)dxbaNi=1Nf(Xi)\int_a^b f(x) dx \approx{\frac{b-a}{N}\sum^N_{i=1}f(X_i)}

将此应用到漫反射模型上

也就是替换BRDF(wi,wo)BRDF(\vec{w_i, \vec{w_o}})为反照率albedo形式,cosθcos\theta可以替换为方向向量点积

Lout(wo)=albedoπLin(wi)cosθdwiL_{out}(\vec{w_o}) = \int{\frac{albedo}{\pi}*L_{in}(\vec{w_i})cos\theta d\vec{w_i}}

=2πNwi(albedoπ)Lin(n.wi) = \frac{2\pi}{N}\sum_{\vec{w_i}}(\frac{albedo}{\pi})L_{in}(\vec{n} \ldotp \vec{w_i})

=2.albedoNwi(n.wi) = \frac{2 \ldotp albedo}{N} \sum_{\vec{w_i}}(\vec{n} \ldotp \vec{w_i})


Importance Sampling

介于cosθcos\theta也就是(n.wi)(\vec{n} \ldotp \vec{w_i})这样的因子,入射光在靠近法线方向上贡献给反射光的辐射度将会更大。

根据Monte Carlo Sampling的样式定义,为求取积分近似值,我们需要将f(Xi)f(X_i)除以PDF(probability density function, 概率密度函数)

PDF与给定求取积分的函数f(x)越成比例,那么理论上说该积分求取收敛的也就会越快。这里f(x)本质上成比例与cosθcos\theta,那么配合上能量守恒可以将PDF定义为

PDF=cosθ2πPDF = \frac{cos\theta}{2\pi}

最终积分近似求解的表达式也就可以简化掉cosθcos\theta部分

Direct Lighting / Next Event Estimation

原先笔者在视频教学中了解到这一项优化技术,以为Next Event Estimation是一个比较小众的优化方式,配合上Advanced Global Illumination以及PBRT,这才明白其实Next Event Estimation本质上就是Direct Lighting,是一个非常常见的高效利用光线的方式。

很常见的方式是讲理想的面光源换为环境贴图,这样能够极大的改善光线利用率

Path tracing的方式本质上就是光线从摄像头发出,在场景中弹跳直到遇到光源为止。这里的关键就在于要遇到光源。

这里最重要的部分就是光源的面积,理想中的点光源在Path traing中得到的画面通常是一篇全黑,因为光线击中点光源的概率为0。粗劣的计算一下一个简单的场景:

角直径(angular diameter)科普,是用于描述从给定视点上观测一个球或者圆形的观测大小,也被成为视角(visual angle)。

如图所示

太阳的角直径大约为32弧分,也就是大约0.5度左右,其立体角(solid angle)

Ω=2π(1cosθ)\Omega = 2\pi(1-cos\theta)

因此粗略得出太阳大约覆盖了61056*10^{-5}立体弧度或者1100000\frac{1}{100000}的半球表面,所以即便是采用接近70000个采样点,半球也不过只有1(1105)70000=50%1-(1-10^{-5})^{70000} = 50\%的几率能够捕捉到太阳光线(换句话说就是发射的光线50%几率能够击中太阳)。


Direct Lighting本质上是重要性采样的直观实践。在每次光线击中表面时我们都向已知光源发射一根光线手动获取其光亮度(当然当真正击中光源时我们将他的权值定为0,因为光源已经在先前部分有了贡献)。